package com.lnj.community.config;

import com.lnj.community.interceptor.DataInterceptor;
import com.lnj.community.interceptor.JwtTokenUserInterceptor;
import com.lnj.community.interceptor.LoginInterceptor;
import com.lnj.community.interceptor.MessageInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Spring MVC 配置类
 *    执行顺序：1.容器初始化：Spring 应用启动时，会加载 WebMVCConfig 这类配置类，执行其中的配置方法，
 *              完成 Spring MVC 组件的初始化，如拦截器、视图解析器等。这一步在请求到达前就已完成。
 *            2.请求到达 DispatcherServlet：客户端发送请求，请求首先到达 DispatcherServlet，它是 Spring MVC 的核心前端控制器。
 *            3.HandlerMapping 查找处理器：DispatcherServlet 调用 HandlerMapping 组件，根据请求的 URL 查找对应的处理器
 *              （通常是 Controller 中的方法），并封装成 HandlerExecutionChain 对象，该对象包含处理器和相关拦截器。
 *            4.执行拦截器 preHandle 方法：按顺序执行 HandlerExecutionChain 中拦截器的 preHandle 方法。
 *              若任一拦截器的 preHandle 方法返回 false，则终止请求处理流程。
 *            5.HandlerAdapter 执行处理器方法：DispatcherServlet 通过 HandlerAdapter 调用找到的处理器方法，
 *              执行 Controller 中的业务逻辑。处理器方法返回 ModelAndView 对象（或其他类型，如 @ResponseBody 返回 JSON 数据）。
 *            6.执行拦截器 postHandle 方法：处理器方法执行完成后，按拦截器添加顺序的逆序执行拦截器的 postHandle 方法。
 *            7.ViewResolver 解析视图：若处理器方法返回 ModelAndView 对象，DispatcherServlet 会调用 ViewResolver 组件，
 *              根据 ModelAndView 中的视图名解析出具体的 View 对象。
 *            8.渲染视图：View 对象将 Model 中的数据渲染到视图中，生成响应内容。
 *            9.执行拦截器 afterCompletion 方法：视图渲染完成后，按拦截器添加顺序的逆序执行拦截器的 afterCompletion 方法。
 *            返回响应：将渲染后的响应内容返回给客户端。
 */
@Configuration
@ComponentScan("com.lnj.community.elasticsearch")
public class WebMVCConfig implements WebMvcConfigurer {

    @Autowired
    private MessageInterceptor messageInterceptor;
    @Autowired
    private DataInterceptor dataInterceptor;

    @Override
    public void addInterceptors(org.springframework.web.servlet.config.annotation.InterceptorRegistry registry) {
        registry.addInterceptor(messageInterceptor)
                .excludePathPatterns(
                        "/login", "/register", "/kaptcha", "/**/*.css", "/**/*.js",
                        "/**/*.png", "/**/*.jpg", "/**/*.jpeg"
                );
        registry.addInterceptor(dataInterceptor)
                .excludePathPatterns(
                        "/login", "/register", "/kaptcha", "/**/*.css", "/**/*.js",
                        "/**/*.png", "/**/*.jpg", "/**/*.jpeg"
                );
    }
}
